package com.example.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ws
 * Date: 2024-03-21
 * Time: 22:30
 *
 * servlet 的生命周期
 * 1. 实例化
 *     构造器
 * 2. 初始化
 *    init()
 * 3. 接受请求，处理请求，服务
 *    service()
 * 4. 销毁
 *     destory()
 *
 * 根据它的生命周期可以得知，Servlet 在 Tomcat 中是单例的
 * 所以 servlet 中的成员变量，都是共享的，在多线程中，可能会出现线程安全问题
 *
 *
 */

@WebServlet(value = "/servletLifeCycle", loadOnStartup = -1)
// loadOnStartup属性指定了Servlet的加载顺序。在这个例子中，loadOnStartup的值为-1，表示这个Servlet在应用程序启动时不会被加载，只有在接收到对应的HTTP请求时才会被实例化并调用
public class ServletLifeCycle extends HttpServlet {

    String name = "Tom";// 共享的

    public ServletLifeCycle() {
        System.out.println("1. 实例化 ServletLifeCycle() 构造器，只会在第一次请求中执行一次");
    }

    @Override
    public void init() throws ServletException {
        System.out.println("2. 初始化 ServletLifeCycle.init() 方法，构造完毕执行一次");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 即只有该方法会多次执行
        System.out.println("3. 接受请求，处理请求，服务 ServletLifeCycle.service() 方法，每次请求都要执行一次");
    }

    @Override
    public void destroy() {
        System.out.println("4. 销毁 ServletLifeCycle.destroy() 方法，关闭服务执行一次");
    }
}
